package com.lyy.polymorphic.object_;


/**
 * @Author:  GZQ
 * @date:  2024/11/23 23:35
 * @description: finalize() 方法演示
 */

public class Finalize_ {

    /*
    1. 当对象被回收时，系统自动调用该对象的 finalize 方法。
       子类可以重写该方法，做一些释放资源的操作

    2. 什么时候被回收：当某个对象没有任何引用时，则 jvm 就认为这个对象是一个垃圾对象，
       就会使用垃圾回收机制来销毁该对象，在销毁该对象前，会先调用 finalize 方法。

    3. 垃圾回收机制的调用，是由系统来决定(即有自己的 GC 算法),
       也可以通过 System.gc() 主动触发垃圾回收机制，

    4. 但实际开发中，几乎不会运用 finalize, 跟多是为了应付面试
    */

    public static void main(String[] args) {
        Car bmw = new Car("宝马");
        // 这时 car对象就是一个垃圾, 垃圾回收器就会回收(销毁)对象, 在销毁对象前,会调用该对象的 finalize 方法
        // 程序猿就可以在 finalize中, 写自己的业务逻辑代码(比如释放资源：数据库的连接, 或打开文件...)
        // 如果程序员不重写 finalize 方法，那么就会调用 Object 类的 finalize, 即默认处理
        // 如果重写了 finalize 方法，就可以实现自己的逻辑
        bmw = null;
        System.gc();  // 主动触发垃圾回收

        System.out.println("程序退出了...");
    }
}


class Car {
    private String name;

    public Car(String name) {
        this.name = name;
    }

    // 重写finalize 方法
    @Override
    protected void finalize() throws Throwable {
        System.out.println("我们销毁了汽车" + name);
        System.out.println("释放了某些资源车....");
    }
}